'''
不同于其他语言，Python解释器可以一行一行进行解析和执行，而非读完整个文件后执行，故后面出错也不会影响前面内容的执行
于是Python除了常规的命令行模式外，还有一种交互模式，即时运行输入的每一行代码，类似vsc里live server下的html
交互模式甚至不需要新建文件，只需要进入交互式环境即可，如Pycharm下方的控制台，或在Windows cmd中输入python3
交互模式可以省略print，输入常/变量名就可直接看到程序输出其值，但交互模式里的内容都不会被保存，退出后即清除
'''
import math
'''
print一类常用函数为内置函数，不用导入，以下是导入其他内置模块的方法和使用格式
1.  import 模块名
    模块名.函数名/变量名
2.  from 模块名 import 函数名,变量名
    函数名/变量名
3.  from 模块名 import *
    函数名/变量名
安装第三方库模块：终端语句pip install 第三方库名，网站pypi.org
'''
'''
**：乘方，如c的pow(2,3)等价于2 ** 3
//:相除并向下取整，如2//3=1
'''
'''这也是一种注释方式，很神奇吧？就它搞特殊'''
print("如你所见，" +
      "这是一个字符串连接"
      "这是一个字符串复制多次" * 5 +
      "可以用\在一行末尾进行分隔\
      （不加\也不加三引号也不重新包围引号直接换行会报错）"
      "，也可用\n\ n在中间换行")
print('Python中,"单双引号不同时使用时可以不用转义符"!')
print('''若想实现自动换行，
可以另起一行print，
也可用三单/双引号（可用于赋值），
其内的内容会自动根据源代码排列换行，
不用额外另起一行print，
就像现在这样，
但注意不能随意加空格
    否则就也会被打印出来''')
userID = 114514
用户名 = "舰长"
print("编号：" + str(userID))
print("姓名：" + 用户名)
print("注意：只有字符串能连接，int需要显式转换（变量名加括号，转换类型可加可不加）为str才能用+连接，否则int间会进行运算")
print("Python的变量都是弱数据类型的，可以自动判断类型，且支持中文名，甚至可以占用关键字（虽然会导致无法使用该关键字）")
print("Python的运算顺序等同于c")
print("输出以2为底8的对数："+str(math.log2(8)))
'''
数据类型：
字符串str："xxx"[0]，用len获取长度（'空格'和完整的'转义符+符号'算一个字符）
整型int
浮点型float
布尔型bool：Trur和False
空值类型NoneType：None，表示未赋值的变量（由于Python的自动类型，未赋值也就没有类型，只能用NoneType）
type(x)：获取x的类型
'''
content = input("提示信息，接收一个输入，返回字符串：")
print("这是你刚刚输入的内容：" + content)
if 0 <= int(content) <= 5:
    print("这是一个if条件语句，条件不用加括号，但要加:，条件可连续比较，可嵌套")
    if True:
        print("不同于其他语言，以缩进（一般为四个空格）判断条件范围，包括嵌套里的if和else对齐")
    else:
        print("这里是嵌套if的else")
elif content == str(10):
    print("这里是else if")
else:
    print("这里是else")
# 逻辑运算符：与and，或or，非not，优先级not>or>and
'''
列表list：xx[]，可为空，用于存放一组相同或不同类型的数据，索引同数组
append添加数据，remove移除数据，len获取长度（元素个数），max/min获取列表最大/小值，sorted返回升序排好的列表
与变量不同的是，变量.方法一般不会改变变量本身的值，但列表.方法可以改变列表的值，即列表属于可变数据类型，变量属于不可变数据类型
'''
var = "variety"
var_list = ["var1", "var2"]
print(var.upper() + ' ' + var)
var_list.append("var3")
print(var_list)
var_list.remove("var3")
print(var_list)
'''
字典dict：存放一组键值对，键只能为不可变数据类型，键和值之间用:关联，多个键值对用{}包围，用,分隔，用字典名[键]获取值，len获取字典长度（键值对个数）
元组tuple：不可变数据类型，多个相同或不同数据类型的组合，用()包围，可作为键
键 in 字典：返回布尔值，判断字典中是否存在该键值对
del 字典[键]：删除对应键值对，若不存在则报错
keys()返回所有键，values()返回所有值，items()返回所有键值对
'''
var_tuple1=("key11","key12")
var_tuple2=("key21","key22")
var_dict={
    var_tuple1:1,
    var_tuple2:2
}
'''
for循环语句
for 变量名（用来存放迭代子对象，如元素，键值对，字符，根据可迭代对象的类型可以有多个（如字典.items()需要键和值两个）） in 可迭代对象（如列表，字典，字符串）:
    操作语句（同样以缩进区分范围）
'''
for key,value in var_dict.items():
    print(str(key)+":"+str(value))
    print("这是for循环输出一个键值对")
'''
整数序列：常用于递增赋值，如for i = range(2,10.2):...，达到for(int i=2;i<=10;i+=2)的效果
range(起始值，结束值)：左闭右开区间
range(起始值，结束值，步长)：同上，即上式为默认步长为1
'''
i = 1
while (i<=5):
    print("这是一个while循环语句")
    i=i+1
#注意：Python里没有++和+=之类的复合运算符
'''
字符串格式化（避免一堆+的不连贯）
1.print("xxx{0}xxx{1}xxx").format(var1,var2)，根据位置替换对象值（format方法会自动转换为str型，且可用{1:.2f}指定浮点型保留位数）
2.print("xxx{a}xxx{b}xxx").format(a=var1,b=var2)，根据关键字替换对象值（替换关键字和format关键字可重名，只要你能分清）
3.print(f"xxx{var1}xxx{var2}xxx")，字符串加前缀f，花括号内变量会直接求值替换
'''
#DRY原则：不要重复你自己，多定义函数/使用继承...
def 函数名(参数名):
    #操作语句（同样以缩进区分范围）
    return xxx#（不写则默认return None）
#类：封装性，继承性，多态性（同方法名不同操作），与java类似
class 父类:
    #构造函数，直接创建新的类属性并赋值，后续可直接self.属性调用（都是公有），self类似this，不用手动传入
    def __init__(self,属性1,属性2):
        self.属性1=属性1
        self.属性2=属性2
class 子类(父类):
    def __init__(self,属性1,属性2,属性3):
        #调用父类的构造函数，避免重复
        super.__init__(属性1,属性2)
        self.属性3=属性3
    #方法，传入self，可以直接获取/修改已绑定的属性值
    def 方法(self,属性):
        return 0
'''
绝对路径：C:\ xxx.txt
相对路径：../..（上上层）/ ..（上层）/ .（该层，可省略）/ xxx.txt
'''